node.jsのいろいろなモジュール36 – Macでnodeアプリをネイティブプロセスとして管理する
普通のnodeアプリとネイティブプロセスとしての管理の違い
通常、nodeアプリを起動した場合、アクティビティモニタで確認すると、次のようなプロセスが表示されます。
別にこれでも大きな問題にはならないのですが、通常のアプリ/サービスと同じように任意の名前で確認できれば便利な場合もあります。 今回紹介するnode-macというモジュールを使用すれば、次のようにnodeアプリに任意の名前をつけてサービス化することができます。
環境構築方法
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.5
- Node.js : v0.10.4
- npm : 1.2.18
npmを使用してnode-macモジュールをインストールしましょう。
% mkdir node-mac % cd node-mac % npm install node-mac
サンプルプログラム作成
まずはネイティブプロセス化して起動するnodeアプリを作成します。 次のようなシンプルなhttpサーバをapp.jsという名前で記述しましょう。
//app.js var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World'); }).listen(3000, '127.0.0.1'); console.log('Server running at http://127.0.0.1:3000/');
そして、node-macを使用してnodeアプリをインストール/アンインストール/スタート/ストップするためのプログラムを記述します。 Serviceオブジェクトで任意の名前、サービス化したいnode.jsファイルのパスを記述します。 下記プログラムではコマンドライン引数によってインストール/アンインストール/スタート/ストップを切り替えるようにしています。
//node-mac.js var Service = require('node-mac').Service; //コマンドライン引数取得 var command = process.argv[2]; //サービスオブジェクト var svc = new Service({ name:'hello server', description:'Hello worldを返す簡易HTTPサーバ.', script: '/path/your/node-mac/app.js' }); //インストール時の動作 svc.on('install',function(){ console.log("install & start service."); svc.start(); }); //すでにサービスがインストールされていた時の動作 svc.on('alreadyinstalled',function(){ console.log("service is already installed."); }); //アンインストール時の動作 svc.on('uninstall',function(){ console.log('Uninstall service.'); console.log('The service exists: ',svc.exists); }); if(command === "install") { svc.install(); } else if(command === "start") { svc.start(); } else if(command === "stop") { svc.stop(); } else if(command === "uninstall") { svc.uninstall(); } else { console.log("usage: sudo node node-mac.js [install | uninstall | start | stop]"); }
では、プログラムをインストールしてみましょう。installコマンドを実行すると、サービスがインストールされ、開始されます。
% sudo node node-mac.js install
アクティビティモニタで確認してみてください。「hello server」という名前のプロセスが起動しています。 また、/Library/Logs/以下にイベントログも出力されるようになります。
サービスの開始、停止はstartとstop、アンインストールする場合にはuninstallオプションを指定してnode-macを実行してください。
% sudo node node-mac.js uninstall //サービスのアンインストール
まとめ
今回はnodeアプリをMacのネイティブプロセスとして管理するアプリ、node-macを使ってみました。 ここにあるように、envオプションを使用すれば サービスに任意の環境変数を渡すこともできます。